package edu.whu.demo.security;

import edu.whu.demo.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;

// 使用@RestController注解，表示这是一个处理HTTP请求的控制器类
// 使用@CrossOrigin注解，允许跨域请求
// 使用@RequestMapping注解，指定该控制器处理的请求路径为"authenticate"
@RestController
@CrossOrigin
@RequestMapping("authenticate")
public class AuthenticationController {
    // 使用@Autowired注解，自动注入JwtTokenUtil对象，用于生成和验证JWT令牌
    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    // 使用@Autowired注解，自动注入PasswordEncoder对象，用于对密码进行加密
    @Autowired
    PasswordEncoder passwordEncoder;

    // 使用@Autowired注解，自动注入UserDetailsService对象，用于加载用户详细信息
    @Autowired
    private UserDetailsService userDetailsService;

    // 使用@PostMapping注解，指定该方法处理POST请求，请求路径为"/login"
    @PostMapping("/login")
    public ResponseEntity<String> login(@RequestBody User user) {
        // 通过用户名从userDetailsService中加载用户详细信息
        final UserDetails userDetails = userDetailsService.loadUserByUsername(user.getId());

        // 使用passwordEncoder对用户输入的密码进行加密，并与存储在数据库中的加密密码进行比较
        if (passwordEncoder.matches(user.getPassword(),userDetails.getPassword())) {  // 匹配成功
            // 如果密码匹配成功，使用jwtTokenUtil生成一个JWT令牌，并将其作为响应返回
            final String token = jwtTokenUtil.generateToken(userDetails);  // 创建token
            return ResponseEntity.ok(token);
        } else {
            // 如果密码匹配失败，返回一个包含错误信息的响应
            return ResponseEntity.badRequest().body("用户认证未通过");
        }
    }
}
